package contable.dominio;

import contable.aplicacion.FactoriaSQL;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Periodo contable en que se realizan los registros y operaciones
 *
 * @author suncin
 */
public class Periodo {

    private int periodo;
    private Date inicio, fin;

    /**
     * Crea una instancia de clase y abre el periodo contable en curso
     */
    public Periodo() {
        periodo = 0;
        inicio = fin = null;
        FactoriaSQL.getINSTANCIA().rollback(this);
    }

    public void setPeriodo(int periodo, Date inicio, Date fin) {
        this.periodo = periodo;
        this.inicio = inicio;
        this.fin = fin;
    }

    /**
     * Obtener el final del periodo
     *
     * @return La fecha y hora cuando se cerro el periodo
     */
    public Date getFin() {
        return fin;
    }

    /**
     * Obtener el inicio del periodo contable
     *
     * @return La fecha y hora en que se inicio el periodo
     */
    public Date getInicio() {
        return inicio;
    }

    /**
     * Obtener cual es el numero de periodo
     *
     * @return el numero de periodo
     */
    public int getPeriodo() {
        return periodo;
    }

    /**
     * Abrir un nuevo periodo contable
     *
     * @param inicio La fecha y hora del nuevo periodo contable
     */
    public void abrirPeriodo(Date inicio) {
        if (inicio == null) {
            throw new IllegalArgumentException("La fecha y hora de inicio del periodo contable no puede estar vacia");
        } else {
            this.inicio = inicio;
            FactoriaSQL.getINSTANCIA().commit(this, getInicio());
        }
    }

    /**
     * Cerrar el periodo contable en curso
     */
    public void cerrarPeriodo() {
        Date fecha = new Date();
        if (fecha.before(inicio)) {
            throw new IllegalArgumentException("La fecha de cierre debe ser despues de la de inicio " + inicio);
        } else {
            fin = fecha;
            FactoriaSQL.getINSTANCIA().commit(this);
        }
    }

    @Override
    public String toString() {
        SimpleDateFormat format = new SimpleDateFormat("dd MMMM 'de' yyyy 'a las' HH:mm:ss");
        return "Periodo contable: n° " + periodo + "\nFecha de inicio: " + format.format(inicio) + (fin == null ? "\nPeriodo actual" : "\nFecha de cierre: " + format.format(fin));
    }
}
